import config from "../config/config.js"
let tool = {
	/**
	 * @function 获取token
	 * @param content 提示的标题
	 */
	getImgPrefix() {
	  return config.imgPrefix
	},
	/**
	 * @function 获取token
	 * @param content 提示的标题
	 */
	getToken() {
	  return uni.getStorageSync('token')
	},
	/**
	 * @function 显示模态弹窗
	 * @param content 提示的标题
	 */
	showConfirm(content) {
		return new Promise((resolve, reject) => {
			uni.showModal({
				title: '提示',
				content: content,
				cancelText: '取消',
				confirmText: '确定',
				success: function(res) {
					resolve(res)
				}
			})
		})
	},
	/**
	 * @func 一维数组转二维数组树形结构功能函数
	 * @param Array arr 需要处理的数组
	 * @description 需要传递一个数组 函数执行处理完毕后会返回一个数组
	 */
	tansformArrayToTree(arr) {
		const parent = [];
		const children = [];
		for (iterator of arr) {
			iterator?.Name?.includes("_") ?
				children.push(iterator) :
				parent.push(iterator);
		}
		for (let i = 0; i < children.length; i++) {
			let key = children[i].Name.substr(0, children[i].Name.indexOf("_"));
			for (let j = 0; j < parent.length; j++) {
				if (parent[j].Name === key) {
					parent[j].children ?
						parent[j].children.push(children[i]) :
						(parent[j].children = [children[i]]);
				}
			}
		}
		return parent;
	},

	/**
	 * @function 一维数组转二维数组树形结构功能函数
	 * @param Array arr 需要处理的数组
	 * @description 需要传递一个数组 函数执行处理完毕后会返回一个数组
	 */
	listTreeFn(arr) {
		let fn = arr.map((item) => ({
			id: item.Name,
			pid: item.Name.split("_").slice(0, item.Name.split("_").length - 1).join("_"),
			...item,
		}));

		function listTree(list) {
			list.forEach((child) => {
				const pid = child.pid;
				if (pid) {
					list.forEach((parent) => {
						if (parent.id === pid) {
							parent.children = parent.children || [];
							parent.children.push(child);
						}
					});
				}
			});
			return list.filter((n) => !n.pid);
		}
		return listTree(fn)
	},
	/**
	 * @function uniapp获取小程序的appId
	 * */
	getAppId() {
		return uni.getAccountInfoSync ? uni.getAccountInfoSync().miniProgram.appId : '';
	},
	/**
	 * @function 请求或传递参数处理,'name=lanQiu&age=23'
	 * @param params 参数
	 */
	tansParams(params) {
		let result = ''
		for (const propName of Object.keys(params)) {
			const value = params[propName]
			var part = encodeURIComponent(propName) + "="
			if (value !== null && value !== "" && typeof(value) !== "undefined") {
				if (typeof value === 'object') {
					for (const key of Object.keys(value)) {
						if (value[key] !== null && value[key] !== "" && typeof(value[key]) !== 'undefined') {
							let params = propName + '[' + key + ']'
							var subPart = encodeURIComponent(params) + "="
							result += subPart + encodeURIComponent(value[key]) + "&"
						}
					}
				} else {
					result += part + encodeURIComponent(value) + "&"
				}
			}
		}
		return result
	},
	/**
	 * @function 全局的授权登录提示框
	 * @param string url  页面跳转地址
	 */
	pleaseLoginTipBox(url) {
		uni.showModal({
			title: '温馨提示',
			content: '您尚未完成微信授权或手机号授权,建议授权以便获得更好的体验!',
			cancelText: "取消",
			confirmText: "去授权",
			showCancel: true,
			confirmColor: '#4e6ef2',
			cancelColor: '#333',
			success: (res) => {
				if (res.confirm) {
					uni.navigateTo({
						url: url
					})
				} else {
					console.log('任然取消授权');
					uni.navigateBack({
						delta: 1
					})
				}
			}
		})
	},
	/**
	 * @function 封装全局的toast提示框
	 * @param string title 	提示文字
	 * @param string icon 	图标样式
	 * @param string time 	动画时长
	 */
	toastTip(title, icon, time) {
		uni.showToast({
			title: title || '网络连接超时,请稍后重试!',
			icon: icon || 'none',
			duration: time || 1500
		})
	},
	/**
	 * @function 根据对象数组的某个属性值做排序
	 * @param @property {Boolean} lift  false 降序 true 升序
	 * @param @property {String} attr  attribute
	 * @example arr.sort(arrSortByObjectAttribute('index',true))
	 * @example arr.sort(arrSortByObjectAttribute('index',false))
	 * @author Mr.Qiu
	 */
	arrSortByObjectAttribute(attr, lift = false) {
		lift = lift ? 1 : -1
		return function(a, b) {
			a = a[attr];
			b = b[attr];
			if (a > b) {
				return lift * 1
			} else if (a < b) {
				return lift * -1
			}
			return 0
		}
	},
	/**
	 * @function 获取自定义时间(带转换格式)
	 */
	getTimeFnOne() {
		let year = new Date().getFullYear();
		let month = new Date().getMonth() + 1 < 10 ? "0" + (new Date().getMonth() + 1) : new Date().getMonth() + 1;
		let date = new Date().getDate() < 10 ? "0" + new Date().getDate() : new Date().getDate();
		let hh = new Date().getHours() < 10 ? "0" + new Date().getHours() : new Date().getHours();
		let mm = new Date().getMinutes() < 10 ? "0" + new Date().getMinutes() : new Date().getMinutes() + 1;
		let ss = new Date().getSeconds() < 10 ? "0" + new Date().getSeconds() : new Date().getSeconds();
		// this.nowDate = year + ":" + month + ":" + date + "";  // 年月日
		// this.nowTime = hh + ":" + mm ;  // 时分
		return year + ":" + month + ":" + date + "" + hh + ":" + mm;
	},
	/**
	 * @function 时间戳转换为年月日(XiaoZhou-1999-10-30)
	 * @param string timestamp 	传入时间戳信息
	 */
	getBirthday(timestamp) {
		let date = new Date(timestamp);
		let year = date.getFullYear();
		let month = date.getMonth() + 1;
		let day = date.getDate();
		month = month < 10 ? "0" + month : month;
		day = day < 10 ? "0" + day : day;
		return year + '-' + month + '-' + day;
	},
	/**
	 * @function 时获取字符串的真实长度（字节长度）
	 * @param string str 	传入字符串
	 */
	strLeng(str) {
		if (str) {
			let len = str.length,
				truelen = 0;
			for (let x = 0; x < len; x++) {
				if (str.charCodeAt(x) > 128) {
					truelen += 2;
				} else {
					truelen += 1;
				}
			}
			return truelen;
		} else {
			return 0;
		}
	},
	/**
	 * @function 获取最近一周的时间
	 * @description 
	 */ 
	getWeekTime() {
		//现在的时间
		var arr = [];
		var dates = new Date();
		dates.setDate(dates.getDate() + 1);
		let year = dates.getFullYear();
		let mounth = (dates.getMonth() + 1).toString().padStart(2, '0');
		let day = dates.getDate().toString().padStart(2, '0');
		let hour = dates.getHours().toString().padStart(2, '0');
		let minutes = dates.getMinutes().toString().padStart(2, '0');
		arr[0] = year + '-' + mounth + '-' + day + ' ' + hour + ':' + minutes + ':' + '00';
		// 一周前的时间
		var time = (new Date()).getTime() - 7 * 24 * 60 * 60 * 1000;
		var tragetTime = new Date(time);
		let tyear = tragetTime.getFullYear();
		let tmounth = (tragetTime.getMonth() + 1).toString().padStart(2, '0');
		let tday = tragetTime.getDate().toString().padStart(2, '0');
		let thour = tragetTime.getHours().toString().padStart(2, '0');
		let tminutes = tragetTime.getMinutes().toString().padStart(2, '0');
		arr[1] = tyear + '-' + tmounth + '-' + tday + ' ' + thour + ':' + tminutes + ':' + '00';
		return arr
	},
	/**
	 * @function 是否在数组内
	 * @param string 	search 		传入的对象
	 * @param array  	array 		传入的数组
	 */
	// 是否在数组内
	inArray(search, array) {
		for (var i in array) {
			if (array[i] == search) return true
		}
		return false
	},
	/**
	 * @function 格式化时间
	 * @param fmt 时间格式
	 * @param date 时间戳
	 * @description 对Date的扩展，将 Date 转化为指定格式的String
	 * @description 月(Y)、月(m)、日(d)、小时(H)、分(M)、秒(S) 可以用 1-2 个占位符，
	 * @description 例子： dateFormat('YYYY-mm-dd HH:MM:SS', new Date()) ==> 2020-01-01 08:00:00
	 */
	dateFormat(fmt, date) {
		const opt = {
			"Y+": date.getFullYear().toString(), // 年
			"m+": (date.getMonth() + 1).toString(), // 月
			"d+": date.getDate().toString(), // 日
			"H+": date.getHours().toString(), // 时
			"M+": date.getMinutes().toString(), // 分
			"S+": date.getSeconds().toString() // 秒
			// 有其他格式化字符需求可以继续添加，必须转化成字符串
		};
		let ret
		for (let k in opt) {
			ret = new RegExp("(" + k + ")").exec(fmt)
			if (ret) {
				fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
			};
		};
		return fmt
	},
	/**
	 * @function 是否为空对象
	 * @param object object 传入一个对象
	 */
	isEmptyObject(object) {
		return Object.keys(object).length === 0
	},
	/**
	 * @function 获取年月
	 * @param {} xxx
	 */
	getYearAndMonth() {
		var currentDate = new Date();
		var year = currentDate.getFullYear();
		var month = currentDate.getMonth() + 1;
		if (month < 10) {
			month = '0' + month;
		}
		var yearMonth = year + '-' + month;
		return yearMonth
	},
	/**
	 * @function 获取上一周的时间日期数据
	 * @param xxx
	 */
	getPreWeekDateFn() {
		// 获取今天的日期对象
		var today = new Date();
		// 获取今天的年、月、日
		var year = today.getFullYear();
		var month = today.getMonth() + 1; // 月份从 0 开始，所以要加 1
		var day = today.getDate();
		// 格式化今天的日期字符串
		var todayString = year + '-' + (month < 10 ? '0' + month : month) + '-' + (day < 10 ? '0' + day : day);
		// 计算今天前一周的日期对象
		var lastWeek = new Date(today.getTime() - 7 * 24 * 60 * 60 * 1000);
		// 获取上周的年、月、日
		var lastWeekYear = lastWeek.getFullYear();
		var lastWeekMonth = lastWeek.getMonth() + 1; // 月份从 0 开始，所以要加 1
		var lastWeekDay = lastWeek.getDate();
		// 格式化上周的日期字符串
		var lastWeekString = lastWeekYear + '-' + (lastWeekMonth < 10 ? '0' + lastWeekMonth : lastWeekMonth) + '-' +(lastWeekDay < 10 ? '0' + lastWeekDay : lastWeekDay);
		return lastWeekString
	},
	/**
	 * @function 身份证号码验证
	 * @param rule 规则
	 * @param value 身份证号
	 * @param callback 验证回调
	*/
	idCardVerification(rule, value, callback) { // 身份证验证
		if (value === '' || value === null) {
			callback()
			return
		}
		if (value.length !== 15 && value.length !== 18) {
			callback(new Error('身份证长度不正确'))
			return
		}
		// 正则表达式验证身份证号码格式
		const regx = /(^\d{15}$)|(^\d{17}([0-9]|X)$)/;
		if (!regx.test(value)) {
			callback(new Error('请输入正确的身份证号码'))
			return false;
		}
		// 验证身份证号码的校验位
		const provinceCode = value.substr(0, 2);
		const birthday = value.substr(6, 8);
		const checkCode = value.substr(17, 1);
		// 验证省份代码
		const provinceRegx = /^[1-9][0-9]/;
		if (!provinceRegx.test(provinceCode)) {
			callback(new Error('请输入正确的身份证号码'))
			return false;
		}
		// 验证生日
		const year = birthday.substr(0, 4);
		const month = birthday.substr(4, 2);
		const day = birthday.substr(6, 2);
		const birthdayDate = new Date(`${year}-${month}-${day}`);
		if (isNaN(birthdayDate.getTime()) || year < 1900 || year > 2100 || month < 1 || month > 12 || day < 1 ||
			day > 31) { //月份校验
			this.messageInfor(rule, callback)
			return false;
		}

		// 验证校验位
		const checkCodeArr = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
		const weightedFactors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
		let sum = 0;
		for (let i = 0; i < 17; i++) {
			sum += parseInt(value.charAt(i)) * weightedFactors[i];
		}
		const mod = sum % 11;
		const checkCodeExpected = checkCodeArr[mod];
		if (checkCode.toUpperCase() !== checkCodeExpected) {
			this.messageInfor(rule, callback, '身份证校验不通过')
			return false;
		}
		callback()
	},
	/**
	 * @desc uni获取经纬度
	 */
	uniGetLocation({
		type = 'wgs84',
		...moreOptions
	} = {}) {
		return new Promise((resolve) => {
			uni.getLocation({
				type,
				success({
					longitude,
					latitude
				}) {
					console.log(`当前位置的经度：${longitude}`);
					console.log(`当前位置的纬度：${latitude}`);
					resolve({
						longitude,
						latitude,
					});
				},
				...moreOptions,
			});
		});
	},
	/**
	 * @description 调起内置地图选择位置
	 */
	uniChooseLocation({
		...moreOptions
	} = {}) {
		return new Promise((resolve) => {
			uni.chooseLocation({
				success(res) {
					console.log('uni.chooseLocation.res', res);
					const {
						address,
						latitude,
						longitude,
						name,
					} = res;
					resolve({
						status: true,
						address,
						latitude,
						longitude,
						name,
					});
				},
				fail(err) {
					console.log('uni.chooseLocation.err', err);
					resolve({
						status: false,
						address: '',
						latitude: 0,
						longitude: 0,
					});
				},
				...moreOptions,
			});
		});
	},
	/**
	 * @description uniapp获取经纬度
	 */
	uniOpenLocation({
		latitude = 39.909,
		longitude = 116.39742,
		...moreOptions
	} = {}) {
		return new Promise((resolve) => {
			uni.openLocation({
				latitude,
				longitude,
				success(res) {
					console.log('uni.uniOpenLocation.res', res);
					resolve({
						status: true
					});
				},
				fail(err) {
					console.log('uni.uniOpenLocation.err', err);
					resolve({
						status: false
					});
				},
				...moreOptions,
			});
		});
	},
};
export default tool;